home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Apple II Magazines (PO)
/
Nibble Volume 09, No. 04 (1988-04)(MicroSPARC)(Side A).zip
/
Nibble Volume 09, No. 04 (1988-04)(MicroSPARC)(Side A).po
/
PRINTWORKS.S
< prev
next >
Wrap
Text File
|
1996-12-24
|
8KB
|
343 lines
*______________________*
* *
* Proportional *
* PrintWorks *
* *
* Character Generator *
* PRINTWORKS *
*______________________*
* *
* Written by *
* Bob Thrasher *
* Copyright (C) 1987 *
* by MicroSPARC, INC *
* Concord, MA 01742 *
*______________________*
* *
* Created with *
* Merlin Pro *
*______________________*
* *
ORG $91EA
ZPage1 EQU $00 ;Temp. zero page pointer
ZPage2 EQU $02 ; "
DUM $300 ;Page 3 parameter passing area
COUTVert DS 1
COUTHorL DS 1
COUTHorH DS 1
LeadingV DS 1
LeadingH DS 1
InvFlag DS 1
SPCWidth DS 1
PrintFlg DS 1
PageNum DS 1
FontNum DS 1
JMPCout DS 4
JMPHome DS 3
JMPGetK DS 3
FontSets DS 2
DEND
Mov MAC ;A macro for conciseness
LDA ]1
STA ]2
<<<
EXP OFF
LDX #$15 ;Initialize defaults
:1 Mov DUMYDATA,X ;COUTVert,X
DEX
BPL :1
LDA $BF00
CMP #$4C
BEQ :2
Mov #<PropCOUT ;$36 ;Intercept OUTPUT routine
LDY #>PropCOUT
STY $37
JSR $3EA
:2 JSR YGen
JMP Home
BELL LDY #$90 ;Special HIRES bell (^G) routine
:1 TYA
TAX
:2 DEX
BNE :2
BIT $C030
DEY
BNE :1
JMP Exit
PropCOUT STA COUTChar ;Save character to exit cleanly
TXA ;Save both X and Y registers
PHA
TYA
PHA
LDA PrintFlg ;See if HIRES print enabled
AND #$02
BEQ :1
LDA COUTChar ;Check for control chars first
AND #$7F
CMP #32
BGE Prop2
CMP #$07
BEQ BELL
CMP #13
BNE Prop1
JSR CursMov1
:1 JMP Exit
Prop1 LDA #32 ;Filter into remaining ASCII
Prop2 SEC
SBC #32
TAX
BNE :1
LDY SPCWidth
JMP DoLead
:1 LDA PageNum ;Has PageNum changed?
CMP OldPage
BEQ :4
STA OldPage
CMP #$01
BEQ :2
LDA #$20
BNE :3
:2 LDA #$40
:3 STA $E6
JSR YGen
:4 LDA FontNum ;Has FontNum changed?
CMP OldFont
BEQ Patch1
STA OldFont
ASL
TAY
Mov FontSets,Y ;Patch1+1
INY
Mov FontSets,Y ;Patch1+2
LDA Patch1+1
CLC
ADC #$60
STA Patch2A+1
STA Patch2B+1
LDA Patch1+2
ADC #$00
STA Patch2A+2
STA Patch2B+2
Patch1 LDA $FFFF,X ;Get the width of character
BEQ Exit ;Width = 0, so ignore printing
STA Temp1
TXA
ASL
TAX
Patch2A LDA $FFFF,X ;Set ZPage1 to point to data
INX
CLC
ADC Patch1+1
STA ZPage1
Patch2B LDA $FFFF,X
ADC Patch1+2
STA ZPage1+1
:1 LDX COUTHorL ;Set ByteBufr to correct values
LDY #$00 ;for printing by DrawIt
Mov (ZPage1),Y ;Temp2
:2 LDA Temp2
AND #$01
BEQ :3
LDA BitTable,X
:3 STA ByteBufr,Y
LSR Temp2
INY
CPY #$08
BNE :2
JSR DrawIt ;Draw this vertical line of char
INC ZPage1 ;Move to next data byte
BNE :4
INC ZPage1+1
:4 JSR CursMove ;Advance HIRES cursor position
DEC Temp1 ;Keep going until width = 0
BNE :1
LDY LeadingH ;Advance cursor by "LeadingH"
DoLead BEQ :2
STY Temp1
:1 JSR ZeroBufr ;Fill with empty spaces as we go
JSR DrawIt
JSR CursMove
DEC Temp1
BNE :1
:2 JSR CursMov2
Exit PLA ;Restore all registers upon exit
TAY
PLA
TAX
LDA PrintFlg ;Need to print to ROM COUT?
AND #$01
BNE :1
LDA COUTChar
RTS
:1 LDA COUTChar
JMP $FDF0
DrawIt Mov #$00 ;Temp3 ;Draw ByteBufr on screen
LDX COUTVert
:1 CPX #192
BGE :3
Mov YHiresL,X ;ZPage2
Mov YHiresH,X ;ZPage2+1
LDY COUTHorL
LDA BitTable,Y
LDY COUTHorH
CPY #40
BGE :3
ORA (ZPage2),Y
BIT InvFlag
BMI :2
LDY COUTHorL
EOR BitTable,Y
:2 LDY Temp3
EOR ByteBufr,Y
LDY COUTHorH
STA (ZPage2),Y
INX
INC Temp3
LDA Temp3
CMP #$08
BNE :1
:3 RTS
ZeroBufr LDX #$07 ;Erase ByteBufr for empty lines
LDA #$00
:1 STA ByteBufr,X
DEX
BPL :1
RTS
CursMove INC COUTHorL ;Advance HIRES cursor one pixel
LDA COUTHorL
CMP #$07
BNE :1
Mov #$00 ;COUTHorL
INC COUTHorH
:1 RTS
CursMov2 LDA COUTHorH
CMP #39
BLT CursMov3
CursMov1 Mov #$00 ;COUTHorH ;Move to start of next line
STA COUTHorL
LDA COUTVert
CLC
ADC #$08
CLC
ADC LeadingV
STA COUTVert
CMP #$C0
BLT CursMov3
Mov #$00 ;COUTVert
CursMov3 RTS
* Home - This is a standard HIRES screen clear routine
* which takes the normal/inverse setting flag
* into consideration.
Home LDY #$20
LDA PageNum
BEQ :1
BIT $C055
LDY #$40
JMP :2
:1 BIT $C054
:2 BIT $C050
BIT $C057
BIT $C052
STY $E6
LDA InvFlag
BEQ :3
LDA #$7F
:3 STA $1C
JSR $F3F6
Mov #$00 ;COUTVert
STA COUTHorL
STA COUTHorH
RTS
* GetKey - Display blinking HIRES cursor until a key is
* pressed then return in A-reg.
GetKey JSR :2
JSR :4
BCS :1
JSR :2
JSR :4
BCC GetKey
BIT $C010
LDA $C000
RTS
:1 JSR :2
BIT $C010
LDA $C000
RTS
:2 LDX COUTVert
Mov #$07 ;Temp1
:3 Mov YHiresL,X ;ZPage1
Mov YHiresH,X ;ZPage1+1
LDY COUTHorL
LDA BitTable,Y
LDY COUTHorH
EOR (ZPage1),Y
STA (ZPage1),Y
INX
DEC Temp1
BPL :3
RTS
:4 LDX #$00
:5 LDA $C000
BMI :6
DEX
BNE :5
CLC
RTS
:6 SEC
RTS
* YGen - Define HIRES tables according to setting of $E6
* ($20=page1, $40=page2)
YGen TXA
PHA
TYA
PHA
Mov #191 ;Temp1 ;Start on bottom line
:1 LDY #$00
JSR $F411 ;Use AppleSoft ROM to find line
LDX Temp1 ;Vertical line # for index
Mov $26 ;YHiresL,X ;Low byte into table
Mov $27 ;YHiresH,X ;High byte into table
DEC Temp1 ;Move up a line
LDA Temp1
CMP #$FF ;Finished with top line yet?
BNE :1 ;Nope, keep going
PLA
TAY
PLA
TAX
RTS
BitTable HEX 01020408102040 ;Mask values
DUMYDATA HEX 00000001010004010000 ;Default parms
CLD
JMP PropCOUT
JMP Home
JMP GetKey
HEX 0000
OldPage HEX FF ;Record keeping variables
OldFont HEX FF
Temp1 DS 1 ;Temporary variables
Temp2 DS 1
Temp3 DS 1
COUTChar DS 1
ByteBufr DS 8
YHiresL EQU *
YHiresH EQU YHiresL+192